package com.woniu.controller;

import cn.dev33.satoken.util.SaResult;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.woniu.entity.CtfContest;
import com.woniu.entity.CtfRange;
import com.woniu.entity.RelContestRange;
import com.woniu.entity.vo.CtfContestVO;
import com.woniu.mapper.CtfContestMapper;
import com.woniu.service.CtfContestService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 考试表控制器
 * @Author 彭明露
 * @Date 2025/6/9 17:56
 * @Description TODO
 **/
@RestController
@RequestMapping("ctfcontest")
@RequiredArgsConstructor
@CrossOrigin
public class CtfContestController {
    @Autowired
    private CtfContestMapper ctfContestMapper;
    private final CtfContestService ctfContestService;

    // 新增考试（自动填充创建时间）
    @PostMapping("/add")
    public SaResult add(@RequestBody CtfContest contest) {
        contest.setCreateTime(new Date()); // 初始化创建时间
        // 若需默认creator，可在此设置（如 contest.setCreator("system"); ）
//        return SaResult.ok().setData(ctfContestMapper.insert(contest));
        // 修改：通过Service调用，而非直接调用Mapper
        return SaResult.ok().setData(ctfContestService.save(contest));
    }

    // 删除考试（物理删除，如需软删除需改update）
    @DeleteMapping("/delete/{id}")
    public SaResult delete(@PathVariable Integer id) {
//        return SaResult.ok().setData(ctfContestMapper.deleteById(id));
        // 修改：通过Service调用删除方法
        return SaResult.ok().setData(ctfContestService.removeById(id));
    }

    // 更新考试（自动填充更新时间）
    @PutMapping("/update")
    public SaResult update(@RequestBody CtfContest contest) {
        contest.setUpdateTime(new Date()); // 记录更新时间
        // 若需记录更新人，可在此补充（如 contest.setUpdater("admin"); ）
//        return SaResult.ok().setData(ctfContestMapper.updateById(contest));
        // 修改：通过Service调用更新方法
        return SaResult.ok().setData(ctfContestService.updateById(contest));
    }

    // 根据ID查询考试
    @GetMapping("/get/{id}")
    public SaResult getById(@PathVariable Integer id) {
//        return SaResult.ok().setData(ctfContestMapper.selectById(id));
        // 修改：通过Service调用查询方法
        return SaResult.ok().setData(ctfContestService.getById(id));
    }

    // 查询所有考试
    @GetMapping("/list")
    public SaResult list() {
//        return SaResult.ok().setData(ctfContestMapper.selectList(null));
        // 修改：通过Service调用查询所有方法
        return SaResult.ok().setData(ctfContestService.list());
    }

    // 模糊搜索（名称/类型/状态/难度）
    @GetMapping("/search")
    public SaResult search(@RequestParam String keyword) {
//        QueryWrapper<CtfContest> wrapper = new QueryWrapper<>();
//        wrapper.like("contest_name", keyword)      // 搜索考试名称
//                .or().like("contest_type", keyword) // 搜索考试类型
//                .or().like("contest_status", keyword) // 搜索考试状态
//                .or().like("contest_difficulty", keyword); // 搜索难度
//        return SaResult.ok().setData(ctfContestMapper.selectList(wrapper));
        // 修改：将复杂查询逻辑移至Service层实现
        return SaResult.ok().setData(ctfContestService.searchContests(keyword));
    }

    // 分页查询根据用户ID
    // TODO 分页待完成
    @GetMapping("/searchByUserId")
    public SaResult page(@RequestParam Integer userId) {
        return SaResult.ok().setData(ctfContestService.selectContestsByUserId(userId));
    }
    /**
     * @Author zhaoj
     * @Date 2025/6/11 11:38
     * @Description 根据考试ID查询考试开始时间
     * @Params contestId
     * @Return contest startTime
     **/
    @RequestMapping("queryStartTime")
    public SaResult queryStartTime(@RequestBody CtfContest contest) {
        return new SaResult().setData(ctfContestMapper.selectById(contest.getContestId()).getStartTime());
    }

    /**
     * @Author zhaoj
     * @Date 2025/6/11 19:19
     * @Description 获取当前考试靶场信息
     **/
    @PostMapping("queryRange")
    public SaResult queryRange(@RequestBody CtfContest contest){
        MPJLambdaWrapper<CtfContest> wrapper = new MPJLambdaWrapper<>();
        wrapper.eq(CtfContest::getContestId,contest.getContestId())
        .leftJoin(RelContestRange.class,RelContestRange::getContestId,CtfContest::getContestId)
        .leftJoin(CtfRange.class,CtfRange::getRangeId,CtfRange::getRangeId)
        .selectAll(CtfRange.class);
        List<CtfRange> list = ctfContestMapper.selectJoinList(CtfRange.class,wrapper);
        return new SaResult().setData(list);
    }

    /**
     * @Author zhaoj
     * @Date 2025/6/12 11:59
     * @Description 查询考试结束时间
     * @Params contestId
     * @Return contest startTime
     **/
    @RequestMapping("queryEndTime")
    public SaResult queryEndTime(@RequestBody CtfContest contest) {
        return new SaResult().setData(ctfContestMapper.selectById(contest.getContestId()).getEndTime());
    }

    /**
     * @Author zhaoj
     * @Date 2025/6/16 19:47
     * @Description 考试表的多条件查询与MybatisPlus分页
     **/
    @PostMapping("query")
    public SaResult queryByArgs(@RequestBody CtfContestVO contest){
        return SaResult.ok().setData(ctfContestService.queryByArgs(contest));
    }

    @GetMapping("searchByUserName")
    public SaResult searchContestByUserName(String userName){
        return SaResult.ok().setData(ctfContestService.searchContestByUserName(userName));
    }
}